home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / UTILITY / XSPAWN.ARJ / MM.ASM < prev    next >
Assembly Source File  |  1991-05-04  |  6KB  |  173 lines

  1. ;
  2. ; (C) Copyright 1990 Whitney Software, Inc.
  3. ;            All Rights Reserved
  4. ;
  5. ; Source for MM.COM.  Displays the largest executable program size.  If
  6. ; expanded memory is available, displays the total amount and the free amount.
  7. ;
  8.  
  9. _TEXT           SEGMENT word public 'CODE'
  10.  
  11.                 ORG     100h
  12.  
  13.                 ASSUME  cs:_TEXT
  14.                 ASSUME  ds:_TEXT
  15.                 ASSUME  es:_TEXT
  16.                 ASSUME  ss:_TEXT
  17.  
  18. ; calculate largest executable program size
  19.  
  20. begin:          mov     ax,cs:[2]               ; end of allocation block
  21.                 mov     bx,cs
  22.                 sub     ax,bx                   ; subtract PSP segment
  23.                 mov     bx,16                   ; convert to bytes
  24.                 call    printi                  ; print integer
  25.                 mov     cx,msg1len              ; length
  26.                 mov     dx,offset msg1          ; message 1
  27.                 call    printm                  ; print message
  28.  
  29. ; determine whether expanded memory is available
  30.  
  31.                 call    chkems                  ; check expanded memory
  32.                 or      ah,ah
  33.                 jnz     exit                    ; jump if no expanded memory
  34.                 mov     ah,42h                  ; get number of pages
  35.                 int     67h
  36.                 or      ah,ah
  37.                 jnz     exit                    ; jump if unsuccessful
  38.                 push    bx                      ; save unallocated pages
  39.  
  40. ; print total bytes EMS memory
  41.  
  42.                 mov     ax,dx                   ; total pages
  43.                 mov     bx,16384                ; convert to bytes
  44.                 call    printi                  ; print integer
  45.                 mov     cx,msg2len              ; length
  46.                 mov     dx,offset msg2          ; message 2
  47.                 call    printm                  ; print message
  48.  
  49. ; print free bytes EMS memory
  50.  
  51.                 pop     ax                      ; unallocated pages
  52.                 mov     bx,16384                ; convert to bytes
  53.                 call    printi                  ; print integer
  54.                 mov     cx,msg3len              ; length
  55.                 mov     dx,offset msg3          ; message 3
  56.                 call    printm                  ; print message
  57.  
  58. exit:           mov     ax,4C00h                ; terminate with 0 return code
  59.                 int     21h
  60.  
  61. printm          PROC    near
  62.  
  63. ; Call with:    CX = message length
  64. ;               DX = message
  65.  
  66.                 mov     ah,40h                  ; write file or device
  67.                 mov     bx,1                    ; standard output device handle
  68.                 int     21h
  69.                 ret
  70.  
  71. printm          ENDP
  72.  
  73. printi          PROC    near
  74.  
  75. ; Call with:    AX = multiplicand
  76. ;               BX = multiplier
  77.  
  78.                 mul     bx
  79.  
  80. ; print integer (DX:AX)
  81.  
  82.                 mov     cx,10                   ; radix equals 10
  83.                 mov     si,offset buffer + 11   ; end of buffer
  84.                 push    si
  85.  
  86. printi1:        push    ax                      ; divide integer by 10
  87.                 mov     ax,dx
  88.                 xor     dx,dx
  89.                 div     cx
  90.                 mov     bx,ax
  91.                 pop     ax
  92.                 div     cx
  93.                 xchg    bx,dx                   ; DX:AX = quotient
  94.                                                 ; BL = remainder
  95.                 add     bl,'0'                  ; convert remainder to ASCII
  96.                 dec     si                      ; back up through buffer
  97.                 mov     [si],bl                 ; store character in buffer
  98.                 mov     bx,ax                   ; is integer 0 yet?
  99.                 or      bx,dx
  100.                 jnz     printi1
  101.  
  102.                 pop     cx                      ; end of buffer
  103.                 sub     cx,si                   ; calculate string length
  104.                 mov     dx,si                   ; beginning of string
  105.                 call    printm                  ; print string
  106.                 ret
  107.  
  108. printi          ENDP
  109.  
  110. chkems          PROC    near
  111.  
  112. ; determine whether expanded memory is available
  113.  
  114.                 mov     dx,offset device        ; EMM device driver name
  115.                 mov     ax,3D00h                ; open file read only
  116.                 int     21h
  117.                 jc      check2                  ; expanded memory unavailable
  118.  
  119. ; determine whether we opened the EMM device driver or a file
  120.  
  121.                 mov     bx,ax                   ; handle
  122.                 mov     ax,4400h                ; IOCTL - get device info
  123.                 int     21h
  124.                 jc      check1                  ; expanded memory unavailable
  125.                 test    dx,80h                  ; test bit 7
  126.                 jz      check1                  ; expanded memory unavailable
  127.  
  128.                 mov     ax,4407h                ; IOCTL - get output status
  129.                 int     21h
  130.                 jc      check1                  ; expanded memory unavailable
  131.                 or      al,al
  132.                 jz      check1                  ; expanded memory unavailable
  133.  
  134. ; close EMM device driver to reclaim handle
  135.  
  136.                 mov     ah,3Eh                  ; close file
  137.                 int     21h
  138.  
  139. ; determine whether the EMM is functional
  140.  
  141.                 mov     ah,40h                  ; get manager status
  142.                 int     67h
  143.                 or      ah,ah
  144.                 jnz     check2                  ; expanded memory unavailable
  145.                 ret
  146.  
  147. ; close EMM device driver or file to reclaim handle
  148.  
  149. check1:         mov     ah,3Eh                  ; close file
  150.                 int     21h
  151.  
  152. check2:         mov     ah,1                    ; expanded memory unavailable
  153.                 ret
  154.  
  155. chkems          ENDP
  156.  
  157. buffer          db      11 dup (?)
  158.  
  159. device          db      'EMMXXXX0',0            ; EMM device driver name
  160.  
  161. msg1            db      ' largest executable program size',0Dh,0Ah,0Dh,0Ah
  162. msg1len         EQU     $-msg1
  163.  
  164. msg2            db      ' bytes total EMS memory',0Dh,0Ah
  165. msg2len         EQU     $-msg2
  166.  
  167. msg3            db      ' bytes free EMS memory',0Dh,0Ah
  168. msg3len         EQU     $-msg3
  169.  
  170. _TEXT           ENDS
  171.  
  172.                 END     begin
  173.